// 1 安装  npm install express --save
// 2.引包  npm init -y

var express = require('express')
var bodyParser = require('body-parser') // post解析


// 3.创建服务器应用程序
var sever = express()

// 配置 body-parser 中间件（插件，专门用来解析表单 POST 请求体）
// parse application/x-www-form-urlencoded
sever.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
sever.use(bodyParser.json())

// 配置使用art-template模板引擎（核心代码段）
// 第一个参数表示，当渲染以.art结尾的文件的时候，使用art-template模板引擎
// express-art-template是专门用来在Express中把art-template整合到Express中
// 虽然外面这里不需要记载art-template 但是也必须安装，原因就在于express-art-template依赖了art-template

// Express为Response响应对象提供了一个办法: render
// render方法默认是不可以使用的，但是如果配置了模板引擎就可以使用了
// res.render('html模板名',{ 模板数据 })
// 第一个参数不能写路径，默认会去项目中的views目录查找该模板文件
// 也就是说Express有一个约定，开发人员把所有的视图文件都放到views目录中

// 如果想要修改默认的views目录，则可以
// sever.set('views',render函数的默认路径)
// sever.set('views','public') 
// sever.get('/',function(req,res){
//     res.render('login.html')
// })

/*--------------------留言板项目开始-------------------- */
var comments = [{
  name: '张三',
  message: '今天天气不错！',
  dateTime: '2015-10-16'
},
{
  name: '张三2',
  message: '今天天气不错！',
  dateTime: '2015-10-16'
},
{
  name: '张三3',
  message: '今天天气不错！',
  dateTime: '2015-10-16'
},
{
  name: '张三4',
  message: '今天天气不错！',
  dateTime: '2015-10-16'
},
{
  name: '张三5',
  message: '今天天气不错！',
  dateTime: '2015-10-16'
}
]

// 进入首页评论列表
// sever.get('/',function(req,res){
//     res.render('index.html', {
//         comments: comments
//     })
// })

// 进入发起评论页面
sever.get('/post', function (req, res) {
  res.render('post.html')
})

// sever.post('/pinglun',function(req,res) {
//     console.log(req)
//     var comment = req.query
//     comment.dateTime = '2021-03-24  14:55:22'
//     comments.unshift(comment)
//     res.redirect('/')
// })

// 当以 POST 请求 /post 的时候，执行指定的处理函数
// 这样的话我们就可以利用不同的请求方法让一个请求路径使用多次
sever.post('/postURL', function (req, res) {
  // console.log(req)
  var comment = req.body
  console.log(comment)
  comment.dateTime = '2021-03-24  14:55:22'
  comments.unshift(comment)
  res.redirect('/') // 重定向到评论列表页
})
/*--------------------留言板项目结束-------------------- */


sever.engine('html', require('express-art-template')) // 不能注释，注释了就找不到html模板了
// sever.get('/',function(req,res){
//     res.render('404.html')
// })

sever.get('/admin', function (req, res) {
  // res.render('admin/test111.html') // 直接读取test111.html文件
  res.render('admin/test111.html', {
    title: '我是啊帆帆'
  })
})

sever.listen(4000, function () {
  console.log('sever is running at port 4000')
})

// 1.在express中开放资源就是一个api的事
// 公开指定目录，只要这样做了，就可以直接通过/public/xx的方式访问public目录中的所有资源了 (注意一定要加上public)这种方式更容易辨识，推荐这种方式，这种情况用的最多
// 这种效果就是，在浏览器输入http://localhost:4000/public/login.html就会打开login.html页面
sever.use('/public/', express.static('./public/'))
sever.use('/static/', express.static('./static/'))


// 2.当省略第一个参数的时候，则可以通过省略/public的方式来访问  浏览器地址 http://127.0.0.1:3000/login.html  注意不要在3000/后面加public/ 否则会报错
// 这种方式的好处是可以省略/public/
// http://localhost:4000/public/login.html   打开login.html页面
// sever.use(express.static('./public/'))

// 3.还有种情况, 必须是/a/public目录中的资源具体路径(注意此时的a是public或static的别名)
sever.use('/a/', express.static('./public/'))
sever.use('/a/', express.static('./static/'))
// http://localhost:4000/a/login.html  打开login.html页面

// 当服务器收到get请求/的时候，执行回调处理函数
sever.get('/', function (req, res) {
  // 可以这样写
  // res.send('hello express!我就想做个测试')

  const students = [
    { id: '001', name: 'tom', age: 18 },
    { id: '002', name: 'jerry', age: 19 },
    { id: '003', name: 'tony', age: 120 },
  ]
  res.send(students)
  // 也可以这样写
  // res.write('hello')
  // res.write('world')
  // res.write('world11sdfsdsdfsd')
  // res.end()
})
// 当服务器收到get请求/about的时候，执行回调处理函数
sever.get('/about', function (req, res) {
  console.log(res.query)
  res.send('about!')
})

sever.get('/get', function (req, res) {
  res.send('get page')
})

// sever.get('/post',function(req,res) {
//     res.send('post page')
// })

// 修改完代码自动重启工具
// npm install --global nodemon  在任意目录执行该命令都可以
// 安装完毕之后,使用
// 之前: node app.js
// 现在: nodemon app.js
// 主要是通过nodemon app.js启动的服务,它会监视你的文件变化,当文件发生变化的时候,自动帮你重启服务

